"""
    pyspark: 多表查询

"""

from __future__ import print_function, division
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local").appName("test").getOrCreate()
sc = spark.sparkContext

# 创建两张表:
d = [{'name': 'Alice', "age": 1}, {'name': "Bryan", "age": 3}, {'name': "Cool", "age": 3}]
df_profile = spark.createDataFrame(d)
df_profile.show()

d = [
    {"name": 'Jason', "child": "Alice"},
    {"name": 'Bill', "child": "Bryan"},
    {"name": 'Sera', "child": "Bryan"},
    {"name": 'Jill', "child": "Ken"},
]
df_profiles = spark.createDataFrame(d)
df_profiles.show()

# 两张表查询  会查询到所有两边都有  没有的不会被查询到
df_profile.join(df_profiles, df_profile.name == df_profiles.child).show()

# 左连接  左表的值没有对应值用，用null值填充
df_profile.join(df_profiles, df_profile.name == df_profiles.child, "left").show()
# 右连接  右表的值没有对应值用，用null值填充
df_profile.join(df_profiles, df_profile.name == df_profiles.child, "right").show()
# 不管左表右表，所有的数据都查询
df_profile.join(df_profiles, df_profile.name == df_profiles.child, "outer").show()

# 注册为sql表可以使用sql语句来操作数据
df_profile.registerTempTable("table")

spark.sql("show tables").show()


# 执行sql语句
def run_sql(sql_string):
    spark.sql(sql_string).show()


sql_string = """
select * from table
"""

run_sql(sql_string)
